import axios from 'axios'
import { ElMessage } from 'element-plus'
import {
    interceptorsReqHandle,
    interceptorsResHandle
} from '@jsjn/micro-core-micro-main/httpInterceptors'
import _ from 'lodash'
import reqErrorText from '@jsjn/micro-core-constants/reqErrorText'
import MAIN_HOST_PATH from '@jsjn/micro-core-micro-main/wujie/constants/MAIN_HOST_PATH'

/**
 * 后台请求 route 具体和后台约定
 */
const KINSO_ROUTE = process.env['VUE_APP_KINSO_ROUTE']
/**
 * 接口响应时间，各项目组可自行调试
 */
const reqTimeout = parseInt(process.env['VUE_APP_REQ_TIMEOUT'] || '3')
const headers = {}
if (KINSO_ROUTE) headers['KinsoLoadBalancerDevRequestConfig'] = KINSO_ROUTE

// 当前项目的 axios 实例
const instance = axios.create({
    timeout: 1000 * reqTimeout,
    headers,
    // 在无界框架下，沙箱添加基座的部署地址 (向基座部署地址发送请求)
    baseURL: MAIN_HOST_PATH
})

/**
 * 请求拦截器，拦截器函数来自基座应用
 * - 请求参数处理（请求头添加）
 * - 登录鉴权处理
 */
instance.interceptors.request.use(
    async (config) => interceptorsReqHandle?.(config),
    (error) => Promise.reject(error)
)

/**
 * 响应拦截器，拦截器函数来自基座应用
 * - 响应结果处理（数据结构处理、登录失效等）
 * - 错误处理
 */
instance.interceptors.response.use(
    async (res) => interceptorsResHandle?.(res),
    (error) => {
        printErrorMsg()
        return Promise.reject(error)
    }
)

/**
 * 统一处理接口抛出错误信息的方式
 * @param errorMsg 错误消息
 * @param type 弹窗类型
 * @param duration 延迟关闭时间
 */
export const printErrorMsg = _.debounce(
    (
        errorMsg: string = reqErrorText.AXIOS_ERRS,
        type: 'error' | 'info' | 'success' | 'warning' = 'error',
        duration: number = 3000
    ): void => {
        ElMessage({
            message: errorMsg,
            type,
            duration
        })
    },
    100
)

export default instance
